package 力扣.双指针.双指针;

import java.util.Arrays;

public class 可获得的最大点数1423 {
    public static void main(String[] args) {
        int[] ints = {6,10,2,1,1,1,8,1};
//        int[] ints = {1,2};
//        int[] ints = {1,2,3,4,5,6,1};
        int i = maxScore(ints, 4);
        System.out.println(i);
    }

    /**
     * 根据题意：只能从数组的开头或者结尾拿一张卡牌，可知我们拿的卡牌只能在数组的后k个元素，和数组的前k个元素之间（可以构造一个环形数组 = {后k个元素，前k个元素}），
     * 因为卡牌必须是连续的k张卡牌，也就是一个滑动窗口，窗口在环形数组中一次一次右移，找到最大的一个窗口就是结果

     */
    public  static int maxScore(int[] cardPoints, int k) {
        int sum = 0;//当前和
        int re = 0;//最大和
        for (int i = cardPoints.length - k; i < cardPoints.length; i++) {//固定一个滑动窗口
            sum += cardPoints[i];
        }
        re = sum;//初始化最大和
        int left = cardPoints.length - k;//left为左指针
        for (int i = cardPoints.length; i < cardPoints.length + k; i++) {//i为右指针
            int te = cardPoints[i - cardPoints.length];//根据数组下标不断模拟环形数组

            //重新计算当前和
            sum -= cardPoints[left];
            sum += te;

            re = Math.max(sum, re);//更新最大和

            left++;//左指针右移
        }
        return re;
    }
}
